#pragma once
#include "jf_aod_base.h"

struct AODFrequency{
    Point center;
    bool isContinuous = false;
    vector<cv::Rect> detectedRect;
    int count = 0;
    int discontinuousTimes = 0;
};//面积变化规律策略中使用的struct

struct AODAlarmTime{
    Point center;
    double startTime;
};

//用于追踪起始位置
struct AODTrack{
    Point center;
    int frameCount = 0; //已经出现的帧数
    int discontinuousCounts = 0; //目前不连续的帧数
    bool isContinuous = true;
}; 

class AODOpenCVPrivate;
class AODOpenCV: public AbandonObjectDetect{
    public:
       AODOpenCV();
       ~AODOpenCV();
       //获取当前检测到的检测框
       vector<cv::Rect> getdetectedRect();

       //将需要检测的图片进行检测
       void detect(const AODInput &input);      
       
       //设置比对背景的更新时间
       void setinterval(int interval);

       //设置与过去每隔step帧取多少帧进行检测框比对
       void setaccurate(int accurate);
       void setstep(int step);

       //设置初始化帧数
       void setthrescount(int threscount);

       //设置是否使用面积框变化策略
       void setUseFrequencyTactics(bool useFreTactics);
       bool getUseFrequencyTactics();

       //设置允许的不连续的面积检测框次数
       void setmaxDiscontinuedTimes(int times);
       int getmaxDiscontinuedTimes();

       void addAODFrequency(cv::Rect rt);//将一段次数内的得到的检测框加入面积变化检测序列
       void cleanAODFrequency();//清除面积检测序列中不时间连续或超过检测的次数范围的检测框
       void detectPreparedRect();//检测面积变化符合条件的检测框
       void cleardetectedRect();//清除当前获取的检测框

       //获取检测框中心点
       Point getCenterPoint(cv::Rect rect);
       //放大检测框倍数
       cv::Rect scale_rect(const cv::Rect& r, float scale);

       //一段时间不重复报警功能是否开启      
       void setUseAlarmTimeTactic(bool isUse);
       bool getUseAlarmTimeTactic();
       
       //是否使用检测框区域与周围区域比对策略
       void setUseAreaComparison(bool isUse);
       bool getUseAreaComparison();

       //2个过滤条件
       int detectLeftRemove(Mat& background, cv::Rect& rect);//仅作周围面积比对策略
       int detectLeftFilter(queue<Mat> qback, Mat& frame, cv::Rect& rect); 

       //追踪检测框起始帧
       void trackDetectedRect(const cv::Rect detectedRect);
       void clearTrackRect();
       int getDetectedFrameCounts(const cv::Rect detectedRect);
    private:
        shared_ptr<AODOpenCVPrivate> m_pHandle;
};